package com.example.lcpractice.heading_offer;

/**
 * [剑指 Offer 24]反转链表.java
 * 定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。
 * <p>
 * 示例:
 * <p>
 * 输入: 1->2->3->4->5->NULL
 * 输出: 5->4->3->2->1->NULL
 * 限制：
 * <p>
 * 0 <= 节点个数 <= 5000
 */
public class q24 {

     static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }

        @Override
        public String toString() {
            return "ListNode{" +
                    "val=" + val +
                    ", next=" + next +
                    '}';
        }
    }

    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        System.out.println(reverseList(listNode1));
    }

    public static ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        while (cur != null) {
            // 1、记住当前节点的next指针
            ListNode next = cur.next;
            // 2、当前节点指针指向过渡节点(指向反转)
            cur.next = prev;
            // 3、当前cur节点成为前一prev节点
            prev = cur;
            // 4、下一next节点成为当前cur节点
            cur = next;
        }
        return prev;


    }


}
